﻿using System;


// 流程 ： 做一件事情需的步骤，按特定的步骤依次执行形成流程

namespace _14._流程控制
{
    class Program
    {
        static void Main(string[] args)
        {
            // TestIf();
            //TestSwitch("边小编");
            //TestWhile(true);
            //TestDoWhile();
            TestFor();
        }

        /// <summary>
        /// 测试流程控制 - if 语句
        /// </summary>
        static void TestIf()
        {
            var 有钱 = true;
            // if 语句的最简程序片段 
            // 断言： 判断申明
            if (有钱) //如果 括号内的断言为真，就进入花括号内的逻辑块
            {
                Console.WriteLine("1. 吃点好的");
            }

            if (有钱)
            {
                Console.WriteLine("2.  吃点好的");

            }
            else // else 否则
            {
                // 意外产生后的逻辑写这儿
                Console.WriteLine("2. 喝粥");

            }

            // 区别对待,多次判断.多个分支
            //分支 ，树的分叉
            string name = "AA";
            if (name == "AA")
            {
                Console.WriteLine("3. 特权");
            }
            else if (name == "bb") //否则 如果是 xxxx
            {
                Console.WriteLine("3. 不管你");
            }
            else if (name == "CCC")
            {

            }

            // 判定要面面俱到
            int age = 16;
            if (age <= 16) //断言 不仅可以是字段，还可以是运算逻辑  
            {
                Console.WriteLine("未成年");
            }
            else if (age > 16)
            {
                Console.WriteLine("成年人");
            }

            //当if后面的花括号仅存在一条语句，有人会省略花括号，IDE 合法
            if (有钱)
                Console.WriteLine("不喝粥");
            if (有钱) Console.WriteLine("不喝粥");

            // if 内 还可以是方法, 但这个方法必须返回 bool 
            if (IsYouQian())
            {

            }

        }
        static bool IsYouQian()
        {
            int 积蓄 = 3000;
            //if (积蓄 >= 3000)
            //{
            //    return true;
            //}
            //return false;
            return 积蓄 >= 3000;
        }
        static void TestSwitch(string name) //test ：测试 
        {
            // 怎么输入： sw + Tab * 2
            // switch : 切换  switcher 开关
            // case ：情况, 我们常说的分情况讨论的这个 “情况” , "如果是"
            // break : 打断，打断当前逻辑
            // default: 默认值 ，默认情况下，当前逻辑中，name 的值找不到匹配的情况
            switch (name)
            {
                case "张三":
                    // 写我们针对 张三 的处理逻辑

                    Console.WriteLine("我是张山");
                    break; //当针对 张三的 处理逻辑执行完毕，在此处跳出 switch 

                case "李四":
                    {
                        // 出现了花括号，方便我们整理、理解自己的代码 
                        Console.WriteLine("我是里斯");

                    }
                    break;
                case "王五": // 王五 和 小九 的情况贯穿（穿插）在一起，这两种情况都走同一个判定逻辑
                case "小九":
                    Console.WriteLine($"{name} 有一个团队");
                    break;

                default:
                    Console.WriteLine("找不到啊啊");
                    break;
            }

            // 演示 Enum 给 switch 带来的便利
            BookType book = BookType.A;
            switch (book)
            {
                case BookType.A:
                    break;
                case BookType.B:
                    break;
                case BookType.C:
                    break;
                default:
                    break;
            }

        }
        enum BookType { A, B, C }

        static void TestWhile(bool value) // 
        {
            // while :  当----的时候 
            // 下面这个最简逻辑解释为： 当 小括号内断言 为真 的时候进入 花括号内的 代码块
            // 断言一直成立形成死循环 。断言状态翻转退出死循环
            // while 循环可加入中断逻辑，退出死循环

            //while (true)
            //{
            //    Console.WriteLine(111);
            //}

            var i = 0;
            while (value)
            {
                for (; i < 5; i++)
                {
                    Console.WriteLine("你传进来的参数为真");
                }
                break; //演示在 while 循环中加入了中断逻辑
            }

            var j = 0;
            while (j<5) //演示在断言中加入中断逻辑
            {
                Console.WriteLine($"J = {j} 还是小于 5");
                j++;
            }
        }

        static void TestDoWhile()  //count 计数（动词），记了多少数（名词）
        {
            // do + tab*2 得到最简dowhile 代码块
            // do : 做 ，干
            // while :当 ... 的时候
            //do
            //{

            //} while (true);

            int count = 10;
            do // 对 while 里面的断言不管，先执行一次
            {
                Console.WriteLine($"做了 {count}");
            } while (count < 10);
        }

        static void TestFor() 
        {
            // for + tab*2 
            // 有三个 内嵌的逻辑语句
            // int j = 0; 声明变量并赋值的语句 ，声明一个变量 i ， 这个语句只执行一次
            // j<10 ; 关系判定的语句 ，判定 i 是否小于 10  ,这个语句每次需要过来做一个判定
            // j++ ; 自增 ，对 i 进行自增，使其发生变化 不变则形成死循环 ，每次过来做一个自增
            for (int j = 0; j < 10; j++)
            {
                Console.WriteLine( j ); // 循环每一次要干的事情写在方法块内部
            }

            string[] arr = new string[3] {"AA","bb","cc" };
            for (int i = 0; i < arr.Length; i++) // Length 长度
            {
                Console.WriteLine($"1. 修改前 ： {arr[i]}");
                arr[i] = $"{arr[i]}-{i}"; // AA - 0
                Console.WriteLine($"2. 修改后 ： {arr[i]}"); // for 循环可以用来修改 遍历出来的每一项 
            }

            //foreach  遍历一个集合
            // 遍历 ：一个一个（挨个）的浏览、查阅、查看
            // fore +tab*2
            // 遍历 arr 字段的每一个子项，arr 是集合 ：数组 或者 List 等等
            //  var 弱类型，可以指带任意的对象类型. 在此处尽量少些（Unity 里面 Transform 类型不能用 var）
            // in : 在里面 
            // item : 每一个子项，item 可以自定义
            foreach (var item in arr)
            {
                Console.WriteLine( item );
                //item = "a";  // 约定，不允许修改 item 项。
            }

            foreach (string item in arr)
            {
            }

            foreach (string name in arr)
            {
            }
        }
    }
}

